package com.tanhua.server.service;


import com.tanhua.common.mapper.UserInfoMapper;
import com.tanhua.common.pojo.User;
import com.tanhua.common.pojo.UserInfo;
import com.tanhua.dubbo.server.pojo.RecommendUser;
import com.tanhua.dubbo.server.vo.PageInfo;
import com.tanhua.server.vo.PageResult;
import com.tanhua.server.vo.RecommendUserQueryParam;
import com.tanhua.server.vo.TodayBest;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 好友推荐业务层
 */
@Service
public class TodayBestService {
    @Autowired
    private UserService userService;

    @Autowired
    private RecommendUserService recommendUserService;

    @Value("${tanhua.sso.default.user}")
    private Long defaultUser;

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Autowired
    private UserInfoService userInfoService;

    /**
     * 查询用户今日佳人业务实现
     *
     * @param token 用户令牌
     * @return
     */
    public TodayBest queryTodayBest(String token) {
        // 一、校验用户令牌
        // 1 校验token令牌。调用UserService，通过SSO的接口进行校验
        User user = userService.queryUserByToken(token);
        if (user == null) {
            // 用户令牌 过期 或 违法
            return null;
        }


        // 二、查询数据，并封装
        // 1 查询今日佳人【参数：用户id】
        TodayBest todayBest = recommendUserService.queryWithMaxScore(user.getId());
        if (todayBest == null) {
            // 今日佳人数据没查询到，免费送一个
            todayBest = new TodayBest();
            todayBest.setId(defaultUser); // 佳人id
            todayBest.setFateValue(80L);  // 缘分值
        }

        // 2 根据查询出的佳人id查询，对应的基本信息
        UserInfo userInfo = userInfoMapper.selectById(todayBest.getId());
        if (userInfo == null) {
            return null;
        }

        // 3 封装数据
        todayBest.setAvatar(userInfo.getLogo()); // 头像
        todayBest.setNickname(userInfo.getNickName()); // 昵称
        todayBest.setGender(userInfo.getSex().getValue() == 1 ? "man" : "woman"); // 性别
        todayBest.setAge(userInfo.getAge()); // 年龄
        todayBest.setTags(StringUtils.split(userInfo.getTags(), ",")); // 标签

        // 三、返回数据
        return todayBest;
    }

    /**
     * 查询推荐好友业务实现
     *
     * @param token      身份识别令牌
     * @param queryParam 查询参数
     * @return
     */
    public PageResult queryRecommendation(String token, RecommendUserQueryParam queryParam) {
        // 一、校验用户令牌
        // 1_校验token令牌。调用UserService，通过SSO的接口进行校验
        User user = userService.queryUserByToken(token);
        if (user == null) {
            // 用户令牌 过期 或 违法
            return null;
        }


        // 二、查询推荐朋友数据
        // 1_推荐朋友集合
        PageInfo<RecommendUser> recommendUserPageInfo = this.recommendUserService.queryRecommendUserList(user.getId(), queryParam.getPage(), queryParam.getPagesize());
        List<RecommendUser> recommendUserList = recommendUserPageInfo.getRecords();
        if (CollectionUtils.isEmpty(recommendUserList)) {
            // 查询推荐朋友们数据没有查到，直接返回null
            return null;
        }

        // 2_将推荐朋友id和缘分值存入map集合中，顺带去一下重
        Map<Long, Double> recommendUserMap = new HashMap();
        for (RecommendUser recommendUser : recommendUserList) {
            recommendUserMap.put(recommendUser.getUserId(), recommendUser.getScore());
        }

        // 三、补全推荐朋友基本信息
        PageResult pageResult = new PageResult();
        pageResult.setPagesize(queryParam.getPagesize()); // 页大小
        pageResult.setPage(queryParam.getPage()); // 当前页

        // 1 查询推荐朋友们的基本信息
        List<UserInfo> userInfoList = this.userInfoService.queryUserInfoList(recommendUserMap.keySet(), queryParam);
        if (userInfoList == null) {
            // 没查到，返回null
            return null;
        }

        // 2 创建集合，用于存放推荐朋友数据
        List<TodayBest> todayBestList = new ArrayList<>();

        // 3 补全推荐朋友基本信息
        TodayBest todayBest = null;
        for (UserInfo userInfo : userInfoList) {
            todayBest = new TodayBest();
            todayBest.setId(userInfo.getUserId()); // id
            todayBest.setAvatar(userInfo.getLogo()); // 头像
            todayBest.setNickname(userInfo.getNickName()); // 昵称
            todayBest.setGender(userInfo.getSex().getValue() == 1 ? "man" : "woman"); // 性别
            todayBest.setAge(userInfo.getAge()); // 年龄
            todayBest.setTags(StringUtils.split(userInfo.getTags(), ",")); // 标签

            Double score = Math.floor(recommendUserMap.get(userInfo.getUserId()));
            todayBest.setFateValue(score.longValue()); // 缘分值

            todayBestList.add(todayBest);
        }

        // 4 排序
        Collections.sort(todayBestList, (o1, o2) -> new Long(o2.getFateValue() - o1.getFateValue()).intValue());
/*

        Collections.sort(todayBestList, new Comparator<TodayBest>() {
            @Override
            public int compare(TodayBest o1, TodayBest o2) {
                Long result = o2.getFateValue() - o1.getFateValue();
                return result.intValue();
            }
        });
*/

        pageResult.setItems(todayBestList);

        // 四、返回数据
        return pageResult;
    }
}
